iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
1
Modern Web

30天帶你潮玩Spring Boot Zone系列 第 11

[Day 11] - @GetMapping 和 @RequestMapping 的比較及使用

  • 分享至 

  • xImage
  •  

閱讀時間: 10分鐘

在Sprint MVC中controller裡面,大家可能在學習或工作時都會看到
@GetMapping 和 @RequestMapping。但究竟它們有什麼分別呢?

分別1:

@GetMapping是在Spring4.3時才有的,在意思上@GetMapping 就是@RequestMapping (method = RequestMethod.GET)

分別2:

@GetMapping 可在method層面上用作處理 http 的請求。
@RequestMapping 可在class層面上配合@GetMapping 使用。

例子:

@Controller
@RequestMapping("/orders")/* 具體指出request的類別*/  

public class OrderController {

@GetMapping("/current")/* @GetMapping 配合@RequestMapping使用
                        當HTTP GET request是 /order時, 
                        orderForm() 會被觸發。 */

public String orderForm(Model model) {

model.addAttribute("order", new Order());

return "orderForm";
}
}

相關參考是來自Craig Walls寫得一本書:
https://ithelp.ithome.com.tw/upload/images/20190916/20119569SvSkIlYWvA.jpg

分別3:

@GetMapping 與 @RequestMapping 不能互相交換。
第1,
@GetMapping的位置只能在class之內,而@RequestMapping在內外也可以
https://ithelp.ithome.com.tw/upload/images/20190916/20119569iqF8naKXIe.jpg
如上圖所示,@GetMapping的位置是有限制性的。

實戰:

@GetMapping 與 @RequestMapping混合使用

第一,建立一個新的子folder灰static底下。
https://ithelp.ithome.com.tw/upload/images/20190916/201195691xXlo8nhyE.jpg
在C:\Users\martinyeung\eclipse-workspace\spring-project-2026\src\main\resources\static下創建一個folder叫qq,同時將所有在static底下的文件都轉移到qq底下。

第2, 修改代碼
可以繼續用上次創建的SpringBootHelloWorld,java
把代碼修改成以下

package com.example.demo;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/qq")
//@RequestMapping(value = "/qq", method = RequestMethod.GET)
public class SpringBootHelloWorld {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	@GetMapping("/x")
	public String hello(){
		return "Hey, Spring Boot 的 Hello World !";
	}
	
	@GetMapping("/indexx")
	public String helloIndex(){
		return "index";
	}

}

儲存SpringBootHelloWorld,java
再開啟sprint boot app
https://ithelp.ithome.com.tw/upload/images/20190916/20119569q3Rg5Mkatv.jpg

成功的話會出現以上畫面。

假如你沒有將static底下的所有文件轉移到qq之下,就會出現以下畫面:
https://ithelp.ithome.com.tw/upload/images/20190916/20119569woZuQSFV4Q.jpg

即使你能夠成功去到想去的頁面,不過所有靜態資源都不能使用。

你可以在瀏覽器上輸入http://localhost:8080/qq/indexx
然後再按F12查看一下console
https://ithelp.ithome.com.tw/upload/images/20190916/20119569nrJumEEP8v.jpg
你會看到所有靜態資源都會出現同一個報錯:

GET http://localhost:8080/qq/vendor/daterangepicker/daterangepicker.js net::ERR_ABORTED 404

為什麼會這樣呢?
因為@RequestMapping或@GetMapping都與靜態資源的關係密切。
假設你設計的網頁有不同語言,可以透過@RequestMapping/@GetMapping來控制使用的靜態資源。
所以必須確定所輸入的路徑是有相對應的靜態資源。

參考文章/網站/書本:


上一篇
[Day 10] - 實戰 - 使用thymeleaf
下一篇
[Day12] – Spring Boot VS SSH
系列文
30天帶你潮玩Spring Boot Zone15
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
iT邦新手 4 級 ‧ 2021-03-03 14:55:17

/images/emoticon/emoticon42.gif
感謝:)
開發的時候總是會卡到靜態資源的路徑:((

我要留言

立即登入留言